package com.sky.wsp.maven.plugin;

import net.bytebuddy.asm.Advice;
import net.bytebuddy.implementation.bind.annotation.*;

import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.concurrent.Callable;

/**
 * @author wangshaopeng@talkweb.com.cn
 * @desccription 在此输入描述
 * @date 2024/4/24
 */
public class LicenseValidate {

    //将返回值转换成具体的方法返回值类型,加了这个注解 intercept 方法才会被执行
    public static @RuntimeType Object intercept(
            // 被拦截的目标对象 （动态生成的目标对象）
            @This Object target,
            // 正在执行的方法Method 对象（目标对象父类的Method）
            @Origin Method method,
            // 正在执行的方法的全部参数
            @AllArguments Object[] argumengts,
            // 目标对象的一个代理
            @Super Object delegate,
            // 方法的调用者对象 对原始方法的调用依靠它
            @SuperCall Callable<?> callable) throws Exception {
        //目标方法执行前执行日志记录
        System.out.println("执行目标方法 前：" + method.getName());
        // 调用目标方法
        Object result = callable.call();
        //目标方法执行后执行日志记录
        System.out.println("执行目标方法 后：" + method.getName());
        return result;
    }

    @Advice.OnMethodEnter
    public static void onMethodEnter(@Advice.Origin Method method) {
        System.out.println("enter " + method.getName() );
    }

    @Advice.OnMethodExit
    public static void onMethodExit(@Advice.Origin Method method) {
        System.out.println("exit " + method.getName());
    }
}


